86. 分隔链表

86. 分隔链表

Similar Question

leading to the advanced question

Solution Tips

双虚拟头

方案一: 模拟

var partition = function(head, x) {
    // 双指针, 需要有一个指针指着可以插入的位置, 另一个指针去找要插入的元素
    // 有点快慢指针的意思, 但是其实不是, 就是单纯的双指针而已, 归类为分段指针
    // 原地操作指针太多, 太复杂了, 不如归并, 最后拼接两个链表就 ok
    let small = new ListNode(0);
    const smallHead = small;
    let large = new ListNode(0);
    const largeHead = large;
    while (head !== null) {
        if (head.val < x) {
            small.next = head;
            small = small.next;
        } else {
            large.next = head;
            large = large.next;
        }
        head = head.next;
    }
    large.next = null;
    small.next = largeHead.next;
    return smallHead.next;


    // let low = dummy;
    // let prev = head;
    // let high = head;
    // // 第一个大于等于 x 的节点一直都是 highHead
    // let highHead = null;

    // while (high !== null) {
    //     if (high.val < x) {
    //         low.next = high;
    //         low = low.next;
    //         // high 的前一个节点要拼接下一个才行
    //         prev.next = high.next;
    //     }
    //     else if (highHead === null) {
    //         highHead = high;
    //     }
    //     else {
    //         prev = high;
    //     }
    //     high = high.next;
    // }

    // low.next = highHead;

    return dummy.next;
};